객체의 상태가 변할 때 그와 연관된 객체들에게 알림을 보내는 패턴
위와 같은 구조로 소통합니다.
Subject 객체와, Observer 객체와의 1:N 관계가 성립됩니다.
Subject 객체에선 구체적인 ConcreteObserver 객체에 대해 알 수 없고, 어떤 동작을 수행하는지 모릅니다.
다만 ConcreteObserver 객체들은 Observer 인터페이스를 구현한다는 것만 알 수 있습니댜.
또 Observer는 언제든 추가되거나 제거될 수 있으며, 이는 Subject 객체에 전혀 영향을 주지 않습니다.
Observer와 Subject 객체는 결합도가 낮아 각각 재사용 할 수 있습니다.
간단하게 유튜브 채널과 구독자로 예를 만들어 보았습니다.
채널에 구독하면 채널에서 알람을 보낼 때 받을 수 있습니다.
실제 유튜브 구독 로직과는 관계 없습니다…! 예시에요.
To min [[HiTV] 즐거운 카페 브이로그 영상이 업로드 되었습니다.]
To lin [[HiTV] 즐거운 카페 브이로그 영상이 업로드 되었습니다.]
To kim [[HiTV] 즐거운 카페 브이로그 영상이 업로드 되었습니다.]
To qasd [[HiTV] 즐거운 카페 브이로그 영상이 업로드 되었습니다.]
To min [[HiTV] 채널 폐쇄 안내]
To lin [[HiTV] 채널 폐쇄 안내]
To kim [[HiTV] 채널 폐쇄 안내]
등록과 제거가 다 잘 되었습니다.
Observer와 Subject 간의 결합을 느슨하게 하며 복잡한 객체 관계에서 1:N 관계의 수정이 필요할 때 유용한 Observer 패턴에 대해 알아보았습니다!
두 패턴의 다이어그램을 보면 굉장히 비슷합니다.
두 패턴의 차이는 Publisher - Subscriber 간의 관계 차이입니다.
옵저버 패턴은 하나의 Publisher에 대한 N개의 Subscriber가 존재합니다.
중재자 패턴은 N개의 Publisher에 M개의 Subscriber가 존재하며, 양 방향으로 상태를 관찰하기 때문에 Publisher와 Subscriber 간의 구분이 없이 Publisher가 되었다가 Subscriber가 될 수도 있습니다.
참조
감사합니다.
Text by Chaelin. Photographs by Chaelin, Unsplash.